<!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <title>opengauss-ivf</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
        <!-- Include all compiled plugins (below), or include individual files as needed -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
        <!-- Bootstrap -->
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
        <style>
            body { padding-top: 50px; }
        </style>
        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
        <!--[if lt IE 9]>
          <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
          <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
      </head>
         <body>

            <nav class="navbar navbar-inverse navbar-fixed-top">
              <div class="container">
                <div class="navbar-header">
                  <a class="navbar-brand" href="index.html">ANN Benchmarks</a>
                </div>
                <div id="navbar" class="collapse navbar-collapse">
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html">Home</a></li>
                  </ul>
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html#datasets">Datasets</a></li>
                  </ul>
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html#algorithms">Algorithms</a></li>
                  </ul>
                  <ul class="nav navbar-nav">
                    <li class="active"><a href="index.html#contact">Contact</a></li>
                  </ul>
                </div><!--/.nav-collapse -->
              </div>
            </nav>

                    <div class="container">
                                                        <h2>Plots for opengauss-ivf</h2>
                                                                <h3>Recall/Queries per second (1/s)</h3>
            <div id="RecallQueries per second (1/s)">
            <canvas id="chartRecallQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.8230000000000001 , y: 1290.936399674981, label: "OpenGaussIvfflatVector(n_list=256, n_probe=5)" },
                                                                    { x: 0.893 , y: 1192.2410460488913, label: "OpenGaussIvfflatVector(n_list=128, n_probe=5)" },
                                                                    { x: 0.967 , y: 1102.6847402016974, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 0.9960000000000001 , y: 872.4973165475408, label: "OpenGaussIvfflatVector(n_list=512, n_probe=50)" },
                                                                    { x: 0.999 , y: 728.0564350386047, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=100)" },
                                                                    { x: 1.0 , y: 671.6614328699515, label: "OpenGaussIvfflatVector(n_list=512, n_probe=100)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Queries per second (1/s) tradeoff - up and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Build time (s)</h3>
            <div id="RecallBuild time (s)">
            <canvas id="chartRecallBuild time (s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallBuild time (s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 1.534637212753296, label: "OpenGaussIvfflatVector(n_list=128, n_probe=200)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Build time (s) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Build time (s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Index size (kB)</h3>
            <div id="RecallIndex size (kB)">
            <canvas id="chartRecallIndex size (kB)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallIndex size (kB)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 6904.0, label: "OpenGaussIvfflatVector(n_list=128, n_probe=200)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Index size (kB) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Index size (kB) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Distance computations</h3>
            <div id="RecallDistance computations">
            <canvas id="chartRecallDistance computations" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallDistance computations");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Distance computations tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Distance computations '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Relative Error/Queries per second (1/s)</h3>
            <div id="Relative ErrorQueries per second (1/s)">
            <canvas id="chartRelative ErrorQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRelative ErrorQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.08434568542128325 , y: 1290.936399674981, label: "OpenGaussIvfflatVector(n_list=256, n_probe=5)" },
                                                                    { x: 0.08402812195543967 , y: 1192.2410460488913, label: "OpenGaussIvfflatVector(n_list=128, n_probe=5)" },
                                                                    { x: 0.0839903395424048 , y: 1143.513335932452, label: "OpenGaussIvfflatVector(n_list=512, n_probe=10)" },
                                                                    { x: 0.08363713064559274 , y: 1102.6847402016974, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 0.08351357136183712 , y: 872.4973165475408, label: "OpenGaussIvfflatVector(n_list=512, n_probe=50)" },
                                                                    { x: 0.0835129912141679 , y: 856.6622413757889, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=50)" },
                                                                    { x: 0.08350102333050252 , y: 728.0564350386047, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=100)" },
                                                                    { x: 0.08350007294358446 , y: 671.6614328699515, label: "OpenGaussIvfflatVector(n_list=512, n_probe=100)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Relative Error-Queries per second (1/s) tradeoff - up and to the left is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Relative Error   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Candidates generated</h3>
            <div id="RecallCandidates generated">
            <canvas id="chartRecallCandidates generated" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallCandidates generated");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 10.0, label: "OpenGaussIvfflatVector(n_list=256, n_probe=50)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Candidates generated tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Candidates generated '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Index size (kB)/Queries per second (s)</h3>
            <div id="RecallIndex size (kB)/Queries per second (s)">
            <canvas id="chartRecallIndex size (kB)/Queries per second (s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallIndex size (kB)/Queries per second (s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.893 , y: 5.790775299072266, label: "OpenGaussIvfflatVector(n_list=128, n_probe=5)" },
                                                                    { x: 0.967 , y: 6.261082382202147, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 1.0 , y: 12.12105728149414, label: "OpenGaussIvfflatVector(n_list=128, n_probe=50)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Index size (kB)/Queries per second (s) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Index size (kB)/Queries per second (s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Epsilon 0.01 Recall/Queries per second (1/s)</h3>
            <div id="Epsilon 0.01 RecallQueries per second (1/s)">
            <canvas id="chartEpsilon 0.01 RecallQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartEpsilon 0.01 RecallQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.898 , y: 1290.936399674981, label: "OpenGaussIvfflatVector(n_list=256, n_probe=5)" },
                                                                    { x: 0.952 , y: 1192.2410460488913, label: "OpenGaussIvfflatVector(n_list=128, n_probe=5)" },
                                                                    { x: 0.99 , y: 1102.6847402016974, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 0.999 , y: 872.4973165475408, label: "OpenGaussIvfflatVector(n_list=512, n_probe=50)" },
                                                                    { x: 1.0 , y: 856.6622413757889, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=50)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Epsilon 0.01 Recall-Queries per second (1/s) tradeoff - up and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Epsilon 0.01 Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Epsilon 0.1 Recall/Queries per second (1/s)</h3>
            <div id="Epsilon 0.1 RecallQueries per second (1/s)">
            <canvas id="chartEpsilon 0.1 RecallQueries per second (1/s)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartEpsilon 0.1 RecallQueries per second (1/s)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 1.0 , y: 1290.936399674981, label: "OpenGaussIvfflatVector(n_list=256, n_probe=5)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Epsilon 0.1 Recall-Queries per second (1/s) tradeoff - up and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Epsilon 0.1 Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Queries per second (1/s) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 50 (millis)</h3>
            <div id="RecallPercentile 50 (millis)">
            <canvas id="chartRecallPercentile 50 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 50 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.8230000000000001 , y: 0.7646083831787109, label: "OpenGaussIvfflatVector(n_list=256, n_probe=5)" },
                                                                    { x: 0.891 , y: 0.8161067962646484, label: "OpenGaussIvfflatVector(n_list=512, n_probe=10)" },
                                                                    { x: 0.893 , y: 0.8273124694824219, label: "OpenGaussIvfflatVector(n_list=128, n_probe=5)" },
                                                                    { x: 0.967 , y: 0.8848905563354492, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 0.9960000000000001 , y: 1.1414289474487305, label: "OpenGaussIvfflatVector(n_list=512, n_probe=50)" },
                                                                    { x: 0.999 , y: 1.3386011123657227, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=100)" },
                                                                    { x: 1.0 , y: 1.466512680053711, label: "OpenGaussIvfflatVector(n_list=512, n_probe=100)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 50 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 50 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 95 (millis)</h3>
            <div id="RecallPercentile 95 (millis)">
            <canvas id="chartRecallPercentile 95 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 95 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.8230000000000001 , y: 0.8603215217590332, label: "OpenGaussIvfflatVector(n_list=256, n_probe=5)" },
                                                                    { x: 0.893 , y: 0.9542584419250488, label: "OpenGaussIvfflatVector(n_list=128, n_probe=5)" },
                                                                    { x: 0.9279999999999999 , y: 1.0173320770263672, label: "OpenGaussIvfflatVector(n_list=256, n_probe=10)" },
                                                                    { x: 0.967 , y: 1.0507345199584959, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 0.9960000000000001 , y: 1.268339157104492, label: "OpenGaussIvfflatVector(n_list=512, n_probe=50)" },
                                                                    { x: 0.998 , y: 1.6101717948913572, label: "OpenGaussIvfflatVector(n_list=2048, n_probe=100)" },
                                                                    { x: 1.0 , y: 1.6622304916381836, label: "OpenGaussIvfflatVector(n_list=512, n_probe=100)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 95 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 95 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 99 (millis)</h3>
            <div id="RecallPercentile 99 (millis)">
            <canvas id="chartRecallPercentile 99 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 99 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.7969999999999999 , y: 0.9287738800048847, label: "OpenGaussIvfflatVector(n_list=512, n_probe=5)" },
                                                                    { x: 0.8550000000000001 , y: 1.0541319847106934, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=10)" },
                                                                    { x: 0.9279999999999999 , y: 1.088969707489014, label: "OpenGaussIvfflatVector(n_list=256, n_probe=10)" },
                                                                    { x: 0.967 , y: 1.2239456176757828, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 0.9960000000000001 , y: 1.410984992980958, label: "OpenGaussIvfflatVector(n_list=512, n_probe=50)" },
                                                                    { x: 0.998 , y: 1.6783356666564941, label: "OpenGaussIvfflatVector(n_list=2048, n_probe=100)" },
                                                                    { x: 1.0 , y: 1.7657542228698735, label: "OpenGaussIvfflatVector(n_list=256, n_probe=50)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 99 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 99 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                                    <h3>Recall/Percentile 99.9 (millis)</h3>
            <div id="RecallPercentile 99.9 (millis)">
            <canvas id="chartRecallPercentile 99.9 (millis)" width="800" height="600"></canvas>
            <script>
                var ctx = document.getElementById("chartRecallPercentile 99.9 (millis)");
                var chart = new Chart(ctx, {
                                        type: "line",
                                        data: { datasets: [
                                                {
                            label: "sift-128-euclidean (k = 10)",
                            fill: false,
                            pointStyle: "rect",
                            borderColor: "rgba(229, 102, 102, 1)",
                            data: [
                                                                    { x: 0.8550000000000001 , y: 1.082810163497925, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=10)" },
                                                                    { x: 0.9279999999999999 , y: 1.1414401531219487, label: "OpenGaussIvfflatVector(n_list=256, n_probe=10)" },
                                                                    { x: 0.967 , y: 1.4916086196899445, label: "OpenGaussIvfflatVector(n_list=128, n_probe=10)" },
                                                                    { x: 0.992 , y: 1.494498014450074, label: "OpenGaussIvfflatVector(n_list=1024, n_probe=50)" },
                                                                    { x: 0.9960000000000001 , y: 1.5618109703063983, label: "OpenGaussIvfflatVector(n_list=512, n_probe=50)" },
                                                                    { x: 0.998 , y: 1.6878950595855713, label: "OpenGaussIvfflatVector(n_list=2048, n_probe=100)" },
                                                                    { x: 1.0 , y: 1.8105771541595466, label: "OpenGaussIvfflatVector(n_list=256, n_probe=50)" },
                                                            ]
                        },
                                                ]},
                        options: {
                            responsive: false,
                            title:{
                                display:true,
                                text: 'Recall-Percentile 99.9 (millis) tradeoff - down and to the right is better'
                            },
                            scales: {
                                xAxes: [{
                                    display: true,
                                    type: 'linear',
                                    max: '1',
                                    position: 'bottom',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Recall   '
                                    }
                                }],
                                yAxes: [{
                                    display: true,
                                    type: 'logarithmic',
                                    scaleLabel: {
                                        display: true,
                                        labelString: ' Percentile 99.9 (millis) '
                                    }
                                }]
                            }
                        }
                    });
                function pushOrConcat(base, toPush) {
                        if (toPush) {
                                if (Chart.helpers.isArray(toPush)) {
                                        // base = base.concat(toPush);
                                        Array.prototype.push.apply(base, toPush);
                                } else {
                                        base.push(toPush);
                                }
                        }

                        return base;
                }
                Chart.Tooltip.prototype.getFooter = function(tooltipItem, data) {
                    var me = this;
                    var callbacks = me._options.callbacks;
                    var item = tooltipItem[0];

                    var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
                    var footer = "Parameters: " + data.datasets[item.datasetIndex].data[item.index].label || '';
                    var afterFooter = callbacks.afterFooter.apply(me, arguments);

                    var lines = [];
                    lines = pushOrConcat(lines, beforeFooter);
                    lines = pushOrConcat(lines, footer);
                    lines = pushOrConcat(lines, afterFooter);

                    return lines;
                }

                </script>
            </div>
            
                        <hr />
                                            <hr />
        
            <div id="contact">
            <h2>Contact</h2>
            <p>ANN-Benchmarks has been developed by Martin Aumueller (maau@itu.dk), Erik Bernhardsson (mail@erikbern.com), and Alec Faitfull (alef@itu.dk). Please use
            <a href="https://github.com/erikbern/ann-benchmarks/">Github</a> to submit your implementation or improvements.</p>
            </div>
        </div>
    </body>
</html>